#include <iostream>  // 包含输入输出流库
#include <vector>    // 包含向量库
#include <map>       // 包含映射库
using namespace std; // 使用标准命名空间

// 定义学生基本信息类
class StudentBase {
private:
    vector<long> mNum;          // 学号向量
    vector<string> mName;       // 姓名向量
    vector<int> mSex;           // 性别向量（假设1为男，0为女）
    vector<int> mAge;           // 年龄向量
    vector<string> mAddr;       // 地址向量
    vector<string> mMajor;      // 专业向量
    map<long, int> mPosition;   // 学号与索引位置的映射
public:
    void bulidBaseData();        // 构建基础数据
    void modifyData();           // 修改数据
    vector<long> getmNum();      // 获取学号向量
    vector<string> getmName();   // 获取姓名向量
    vector<int> getmSex();       // 获取性别向量
    vector<int> getmAge();       // 获取年龄向量
    vector<string> getmAddr();   // 获取地址向量
    long getNumAtIndex(int);     // 根据索引获取学号
    string getNameAtIndex(int);  // 根据索引获取姓名
    int getSexAtIndex(int);      // 根据索引获取性别
    int getAgeAtIndex(int);      // 根据索引获取年龄
    string getAddrAtIndex(int);  // 根据索引获取地址
    int getmPosition(long);      // 根据学号获取其在向量中的位置
};

// 定义专业A的学生信息类，继承自StudentBase
class FirstA : virtual public StudentBase {
private:
    char mA_MajorDepName[30];   // 专业A的院系名称
    vector<long> majorA_Num;    // 专业A的学生学号
    vector<long> secondA_Num;   // 专业A的第二专业学生学号
    vector<string> A_Scond_MajorName;  // 第二专业名称
    vector<vector<int>> mA_FirstScore;  // 专业A的第一学期成绩
    vector<vector<int>> A_Fscore;       // 专业A的最终成绩
public:
    FirstA();                    // 构造函数
    void inputA_MajorScore();    // 输入专业A的第一学期成绩
    void inputA_SecondScore();   // 输入专业A的第二专业成绩
    void outputA_Good();         // 输出专业A成绩优秀的学生
    void outputA_MajorFail();    // 输出专业A专业课不及格的学生
    void outputA_SecondFail();   // 输出专业A第二专业不及格的学生
    char* getA_MajorDepName();   // 获取专业A的院系名称
    vector<long> getA_MajorNum(); // 获取专业A的学生学号
    vector<long> getA_SecondNum(); // 获取专业A的第二专业学生学号
    vector<vector<int>> getA_FirstScore(); // 获取专业A的第一学期成绩
    vector<vector<int>> getA_FScore();     // 获取专业A的最终成绩
};

// 定义专业B的学生信息类，继承自StudentBase
class FirstB : virtual public StudentBase {
private:
    char mB_MajorDepName[30];   // 专业B的院系名称
    vector<long> majorB_Num;    // 专业B的学生学号
    vector<long> secondB_Num;   // 专业B的第二专业学生学号
    vector<string> B_Scond_MajorName;  // 第二专业名称
    vector<vector<int>> mB_FirstScore;  // 专业B的第一学期成绩
    vector<vector<int>> B_Fscore;       // 专业B的最终成绩
public:
    FirstB();                    // 构造函数
    void inputB_MajorScore();    // 输入专业B的第一学期成绩
    void inputB_SecondScore();   // 输入专业B的第二专业成绩
    void outputB_Good();         // 输出专业B成绩优秀的学生
    void outputB_MajorFail();    // 输出专业B专业课不及格的学生
    void outputB_SecondFail();   // 输出专业B第二专业不及格的学生
    char* getB_MajorDepName();   // 获取专业B的院系名称
    vector<long> getB_MajorNum(); // 获取专业B的学生学号
    vector<long> getB_SecondNum(); // 获取专业B的第二专业学生学号
    vector<vector<int>> getB_FirstScore(); // 获取专业B的第一学期成绩
    vector<vector<int>> getB_FScore();     // 获取专业B的最终成绩
};

// 定义专业C的学生信息类，继承自StudentBase
class FirstC : virtual public StudentBase {
private:
    char mC_MajorDepName[30];   // 专业C的院系名称
    vector<long> majorC_Num;    // 专业C的学生学号
    vector<long> secondC_Num;   // 专业C的第二专业学生学号
    vector<string> C_Scond_MajorName;  // 第二专业名称
    vector<vector<int>> mC_FirstScore;  // 专业C的第一学期成绩
    vector<vector<int>> C_Fscore;       // 专业C的最终成绩
public:
    FirstC();                    // 构造函数
    char* getC_MajorDepName();   // 获取专业C的院系名称
    void inputC_MajorScore();    // 输入专业C的第一学期成绩
    void inputC_SecondScore();   // 输入专业C的第二专业成绩
    void outputC_Good();         // 输出专业C成绩优秀的学生
    void outputC_MajorFail();    // 输出专业C专业课不及格的学生
    void outputC_SecondFail();   // 输出专业C第二专业不及格的学生
    vector<long> getC_MajorNum(); // 获取专业C的学生学号
    vector<long> getC_SecondNum(); // 获取专业C的第二专业学生学号
    vector<vector<int>> getC_FirstScore(); // 获取专业C的第一学期成绩
    vector<vector<int>> getC_FScore();     // 获取专业C的最终成绩
};

// 定义综合管理系统类，继承自FirstA, FirstB, FirstC
class StudentMIS : public FirstA, public FirstB, public FirstC {
private:
    int SA, SB, SC;             // 专业A, B, C的学生数量
    int KA, KB, KC;             // 专业A, B, C的某个标准计数器
public:
    StudentMIS();              // 构造函数
    void degreeStanderOfFirst(); // 定义第一学期成绩标准
    void degreeStanderOfSecond(); // 定义第二学期成绩标准
    void degree();               // 综合评分方法
};